//package org.jeecg.modules.wangyue.aop;
//
//import org.aspectj.lang.JoinPoint;
//import org.aspectj.lang.annotation.*;
//import org.jeecg.common.api.vo.Result;
//import org.jeecg.common.util.oConvertUtils;
//import org.jeecg.modules.wangyue.controller.applogin.UserLoginController;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
//import javax.servlet.http.HttpServletRequest;
//import java.util.Arrays;
//
//@Aspect
//@Component
//public class CheckTokenAop {
//
//    @Autowired
//    private RedisTemplate redisTemplate;
//
//    //匹配controller.app类下面的所有共有方法。
//    //访问controller.app里面的类的方式的时候  需要进行token验证，访问controller外层的接口的时候不需要验证token
//    @Pointcut("execution(public * org.jeecg.modules.wangyue.controller.app.*.*(..))")
//    public void loc() throws Exception {
//
//    }
//
//
//    //前置通知
//    @Before("loc()")
//    public void deBefore(JoinPoint jp) throws Throwable {
////        // 接收到请求，记录请求内容
////        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
////        HttpServletRequest request = attributes.getRequest();
////
////        // 记录下请求内容
////        System.out.println("URL : " + request.getRequestURL().toString());
////        System.out.println("HTTP_METHOD : " + request.getMethod());
////        System.out.println("CLASS_METHOD : " + jp);
////        System.out.println("ARGS : " + Arrays.toString(jp.getArgs()));
////        System.out.println("前置通知：方法执行前执行...");
//
//    }
//
//
//    //返回通知
//    @AfterReturning(returning = "ret", pointcut = "loc()")
//    public void doAfterReturning(Object ret) throws Throwable {
////        // 处理完请求，返回内容
////        System.out.println("返回通知：方法的返回值 : " + ret);
//
//        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
//        String tokenId = requestAttributes.getRequest().getHeader("tokenId");//从请求头里面拿到tokenId(就是userId)
//        String token = requestAttributes.getRequest().getHeader("token");//从请求头里面拿到token
//
//        //TODO 只对Result返回类型就行token校验
//        //如果在redis中，key为tokenId对应的value，与token值相等，则允许调用接口
//        if(oConvertUtils.isNotEmpty(token) && token.equals(redisTemplate.opsForValue().get("token_" + tokenId))){
//            System.out.println("Token(" + token + ")：有效！");
//        }else{ //不相等，说明token失效
//            if(oConvertUtils.isNotEmpty(ret) && ret instanceof Result){
//                System.out.println("Token(" + token + ")：已过期！");
//                Result<?> result = (Result) ret;
//                result.setSuccess(false);
//                result.setCode(401);
//                result.setMessage("Token失效，请重新登录!");
//                result.setTimestamp(result.getTimestamp());
//                result.setResult(null);
//            }else{
//                System.out.println("返回的类型不是Result!");
//            }
//        }
//    }
//
//
//    //异常通知
//    @AfterThrowing(throwing = "ex", pointcut = "loc()")
//    public void throwss(JoinPoint jp, Exception ex) {
////        System.out.println("异常通知：方法异常时执行.....");
////        System.out.println("产生异常的方法：" + jp);
////        System.out.println("异常种类：" + ex);
//}
//
//
//    //后置通知
//    @After("loc()")
//    public void after(JoinPoint jp){
////        System.out.println("后置通知：最后且一定执行.....");
//    }
//
//
//}
